﻿using System;
using System.Collections.ObjectModel;
using System.ComponentModel.DataAnnotations;

namespace IssueVision.Data.Web
{
    /// <summary>
    /// PasswordResetUser class client-side extensions
    /// </summary>
    public partial class PasswordResetUser
    {
         /// <summary>
        /// Stores the password the user entered in the registration UI, 
        /// even if it is invalid. This way we can validate the password
        /// confirmation adequately all the times   
        /// </summary>
        /// <remarks>
        /// This gets set on the <see cref="System.Windows.Controls.PasswordBox.PasswordChanged"/> event
        /// </remarks>
        public string ActualPassword { get; set; }

        [Display(Name = "PasswordConfirmationLabel", ResourceType = typeof(IssueVisionResources))]
        [Required(ErrorMessageResourceName = "ValidationErrorRequiredField", ErrorMessageResourceType = typeof(ErrorResources))]
        [CustomValidation(typeof(PasswordResetUser), "CheckPasswordConfirmation")]
        public string PasswordConfirmation
        {
            get
            {
                return _passwordConfirmation;
            }

            set
            {
                ValidateProperty("PasswordConfirmation", value);
                _passwordConfirmation = value;
                RaisePropertyChanged("PasswordConfirmation");
            }
        }
        private string _passwordConfirmation;

        /// <summary>
        /// Custom validation of whether new password and confirm password match
        /// </summary>
        /// <param name="passwordConfirmation"></param>
        /// <param name="validationContext"></param>
        /// <returns></returns>
        public static ValidationResult CheckPasswordConfirmation(string passwordConfirmation, ValidationContext validationContext)
        {
            var currentUser = (PasswordResetUser)validationContext.ObjectInstance;

            if (!string.IsNullOrEmpty(currentUser.ActualPassword) &&
                !string.IsNullOrEmpty(passwordConfirmation) &&
                currentUser.ActualPassword != passwordConfirmation)
            {
                return new ValidationResult(ErrorResources.ValidationErrorPasswordConfirmationMismatch, new[] { "PasswordConfirmation" });
            }

            return ValidationResult.Success;
        }

        /// <summary>
        /// Try validate the specified property for PasswordResetUser class
        /// </summary>
        /// <param name="propertyName"></param>
        /// <returns></returns>
        public bool TryValidateProperty(string propertyName)
        {
            if (string.IsNullOrEmpty(propertyName))
            {
                throw new ArgumentNullException("propertyName");
            }

            if (propertyName == "Name" || propertyName == "NewPassword"
                || propertyName == "PasswordConfirmation" || propertyName == "PasswordAnswer")
            {
                var context = new ValidationContext(this, null, null) { MemberName = propertyName };

                var validationResults = new Collection<ValidationResult>();

                if (propertyName == "Name")
                    return Validator.TryValidateProperty(Name, context, validationResults);
                if (propertyName == "NewPassword")
                    return Validator.TryValidateProperty(NewPassword, context, validationResults);
                if (propertyName == "PasswordConfirmation")
                    return Validator.TryValidateProperty(PasswordConfirmation, context, validationResults);
                if (propertyName == "PasswordAnswer")
                    return Validator.TryValidateProperty(PasswordAnswer, context, validationResults);
            }
            return false;
        }
    }
}
